<?php

/**
 * ObjectModel for fiche database table. 
 * @author Nicolas Legrand <n.legrand28@gmail.com>
 */
class FicheAbo extends ObjectModel
{
	
	public $id_abo;
	public $id_customer;
	public $customer_firstname;
	public $customer_lastname;
	public $customer_email;
	public $date_start;
	public $date_end;
	public $storeSize;
	public $twoInOne;
	
	// LVM : addition pour contourner les résultats select avec 2 tables (ou plus)
	//       company pas dans la table ficheAbo mais customer
	public $company;
	
	public static $definition = array(
	
  		'table' 	=> 'ficheAbo',
  		'primary' 	=> 'id_abo',
  		'multilang' => false,
 		'fields' => array(
   			'id_abo' => array(
   				'type' => ObjectModel :: TYPE_INT
			),
			'id_customer' => array(
   				'type' => ObjectModel :: TYPE_INT, 
   				'required' => true
			),
			'customer_firstname' => array(
   				'type' => ObjectModel :: TYPE_STRING, 
   				'required' => true
			),
			'customer_lastname' => array(
   				'type' => ObjectModel :: TYPE_STRING, 
   				'required' => true
			),
			'customer_email' => array(
   				'type' => ObjectModel :: TYPE_STRING, 
   				'required' => true
			),
			
			/*
			// LVM : addition pour contourner les résultats select avec 2 tables (ou plus)
			//       company pas dans la table ficheAbo mais customer
			'company' => array(
   				'type' => ObjectModel :: TYPE_STRING, 
   				'required' => false         // sinon erreur à la création d'un nouveau user avec abonnement LFV 
   				                            // mais ne suffit pas car erreur plus loin avec le add()...
   				                            //       En fait pas nécessaire de gérer un definition2 si ce code est en commentaire. 
   				                           
			),
			*/
			
			'storeSize' => array(
   				'type' => ObjectModel :: TYPE_INT, 
   				'required' => true
			),
			'twoInOne' => array(
   				'type' => ObjectModel :: TYPE_INT, 
   				'required' => true
			),
			'date_start' => array(
   				'type' => ObjectModel :: TYPE_DATE, 
   				'required' => false
			),
			'date_end' => array(
   				'type' => ObjectModel :: TYPE_DATE, 
   				'required' => false
			)
  		)
	);
	
	// LVM : second tableau sans le champ company pour contourner erreur lors d'une addition (insert) d'un user LFV qui génère une erreur
	/*
	public static $definition2 = array(
	
  		'table' 	=> 'ficheAbo',
  		'primary' 	=> 'id_abo',
  		'multilang' => false,
 		'fields' => array(
   			'id_abo' => array(
   				'type' => ObjectModel :: TYPE_INT
			),
			'id_customer' => array(
   				'type' => ObjectModel :: TYPE_INT, 
   				'required' => true
			),
			'customer_firstname' => array(
   				'type' => ObjectModel :: TYPE_STRING, 
   				'required' => true
			),
			'customer_lastname' => array(
   				'type' => ObjectModel :: TYPE_STRING, 
   				'required' => true
			),
			'customer_email' => array(
   				'type' => ObjectModel :: TYPE_STRING, 
   				'required' => true
			),
			
			'storeSize' => array(
   				'type' => ObjectModel :: TYPE_INT, 
   				'required' => true
			),
			'twoInOne' => array(
   				'type' => ObjectModel :: TYPE_INT, 
   				'required' => true
			),
			'date_start' => array(
   				'type' => ObjectModel :: TYPE_DATE, 
   				'required' => false
			),
			'date_end' => array(
   				'type' => ObjectModel :: TYPE_DATE, 
   				'required' => false
			)
  		)
	);
	*/
	
	public static function getFicheAbo($customerId)
	{
		$abo = FicheAbo::findAboByCustomerId($customerId);
		
		if ( $abo == null )
		{
			$currentCustomer = new Customer($customerId);
			
			if ( $currentCustomer->id == null)
				return null;
			
			$abo = new FicheAbo();
			
			$abo->customer_firstname = $currentCustomer->firstname;
			$abo->customer_lastname = $currentCustomer->lastname;
			$abo->customer_email = $currentCustomer->email;
			$abo->id_customer = $customerId;
			$abo->date_start = date('Y-m-d', time());
			$abo->date_end = date('Y-m-d', time() + (3600 * 24));
			$abo->storeSize = 5 * 1024 * 1024;
			$abo->twoInOne = 0;
			
			// LVM
			//$save_definition = $this->definition; // Ou FicheAbo::definition
			
			//$this->definition = $this->definition2; // Ou FicheAbo::definition2
			//
			
			$abo->add();
			
			// LVM
			//$this->definition = $save_definition;
		}
		
		return $abo;
	}
	
	public static function setAboEndBy($customerId, $value)
	{
		$value = time() + $value;
		$abo = FicheAbo::getFicheAbo($customerId);
		
		if ( $abo != null && $value > 0)
		{
			$abo->date_end = date('Y-m-d', $value);
			$abo->update();
		}
	}
	
	public static function buildWhereClause($conditions)
	{
		$whereClause = '';
		$i = 0;
		
		foreach( $conditions as $key => $value )
		{
			$whereClause .= ($i == 0) ? ' WHERE ' : ' AND ';
			
			if ( is_array($value) )
			{
				if ( $value['operator'] == 'LIKE' )
				{
					$whereClause .= $value['column']." LIKE '%".$value['value']."%'";
				}
				else
				{
					$whereClause .= $value['column']." ".$value['operator']." '".$value['value']."'";
				}
			}
			else
			{
				$whereClause .= $key." = '".$value."'";
			}
			$i++;
		}
		
		return $whereClause;
	}
	
	public static function findAboByCustomerId($id)
	{
		$abos = FicheAbo::findAboBy(array('id_customer' => (int)($id)));
		if ( count($abos) > 0)
		{
			return $abos[0];
		}
		
		return null;
	}
	
	// LVM
	//public static function getTotalAboWhere($conditions)
	public static function getTotalAboWhere($conditions, $conditions2)
	{
		// LVM
		//$sql = 'SELECT COUNT(id_abo) as total FROM ' . _DB_PREFIX_ . 'ficheAbo ';
		//$sql .= Fiche::buildWhereClause($conditions);
		$sql = 'SELECT COUNT(fa.id_abo) as total  FROM ' . _DB_PREFIX_ . 'ficheAbo as fa';
		
		$sql .= ', '._DB_PREFIX_ . 'customer as c';
		
		if (sizeof($conditions) > 0)
		{
			$sql .= ' '.Fiche::buildWhereClause($conditions, $prefixetable = 'fa');
		}
		elseif (sizeof($conditions) == 0)
		{
			$sql .= ' WHERE 1 = 1';
		}
		
		$sql .= ' AND c.id_customer = fa.id_customer';
		
		if (sizeof($conditions2) > 0)
		{
			$sql .= ' AND '.str_replace('WHERE', '', Fiche::buildWhereClause($conditions2));
		}
		
		$total = 0;
		
		if ($rows = Db :: getInstance()->ExecuteS($sql)) 
		{
			$total = (int)($rows[0]['total']);
		}
			
		return $total;
	}
	
	// LVM
	//public static function findAboBy($conditions, $start = -1, $end = -1, $orderBy = null, $asc = true)
	public static function findAboBy($conditions, $start = -1, $end = -1, $orderBy = null, $asc = true, $conditions2=array())
	{
		// LVM : filtrage et affichage société dans tous les cas
		//       Gérer une requête sur 2 tables si recherche par société..
		/*
		$sql = 'SELECT * FROM ' . _DB_PREFIX_ . 'ficheAbo ';
		$sql .= Fiche::buildWhereClause($conditions);
		*/
		
		$sql = 'SELECT fa.*, c.company  FROM ' . _DB_PREFIX_ . 'ficheAbo as fa';
		
		$sql .= ', '._DB_PREFIX_ . 'customer as c';
		
		if (sizeof($conditions) > 0)
		{
			$sql .= ' '.Fiche::buildWhereClause($conditions, $prefixetable = 'fa');
		}
		elseif (sizeof($conditions) == 0)
		{
			$sql .= ' WHERE 1 = 1';
		}
		
		//$sql .= ' AND '._DB_PREFIX_ .'customer.id_customer = '._DB_PREFIX_ .'ficheAbo.id_customer';
		$sql .= ' AND c.id_customer = fa.id_customer';
		
		if (sizeof($conditions2) > 0)
		{
			$sql .= ' AND '.str_replace('WHERE', '', Fiche::buildWhereClause($conditions2));
		}
	
		
		// LVM : ordre LIMIT et ORDER BY doivent être inversés
		/*
		if ( $start != -1 || $end != -1)
		{
			$sql .= ' LIMIT '.$start.', '.$end;
		}
		
		if ( $orderBy != null )
		{
			$sens = ( $asc == true ) ? 'ASC':'DESC';
			$sql .= ' ORDER BY '.$orderBy.' '.$sens;
		}
		*/
		if ( $orderBy != null )
		{
			$sens = ( $asc == true ) ? 'ASC':'DESC';
			$sql .= ' ORDER BY '.$orderBy.' '.$sens;
		}
		
		if ( $start != -1 || $end != -1)
		{
			$sql .= ' LIMIT '.$start.', '.$end;
		}
		
		//echo 'sql = '.$sql.'---';
		
		// LVM
		if ($rows = Db :: getInstance()->ExecuteS($sql))
			return ObjectModel :: hydrateCollection(__CLASS__, $rows);  
		
		// LVM : après addition de 'public $company;' il n'y a plus d'exception...
		/*
		try
		{
			$rows = Db :: getInstance()->ExecuteS($sql);
		}
		
		catch (Exception $e)
		{	
			// On ne veut pas que l'erreur c.company non trouvé remonte et bloque les choses...
			// On ne fait donc rien car rows est bien rempli...
			echo 'Exception reçue : ',  $e->getMessage(), "\n";
		}
		
		if ($rows)
		{
			// LVM
			// Un mélange de table 'fonctionne' jusqu'au rows, sauf le pb de l'exception, 
			// mais pas à travers ObjectModel :: hydrateCollection(__CLASS__, $rows);
			// (qui re-transforme un tableau avec clef en attribut sur un objet...)
			// Même si on ajoute un faux champ 'company' dans $definition (liste des colonnes de la table)
			// le résultat de la ligne est bien trouvé mais la valeur de company n'est pas recopié dans l'attribut de l'objet...
			//var_dump($rows);
			
			return ObjectModel :: hydrateCollection(__CLASS__, $rows);
		}
		*/
		
		return array();
	}
	
	// LVM : uniquement modèle ou fiche privé (peut servir aussi à écarter les fiches/modèles créés par les admin)
	public static function findAboActiv($excludeUsersAdmin = '1186, 1373, 980', $orderBy = null, $asc = true, $start = -1, $end = -1)
	{
		// LVM : on a besoin des dates de de création du user donc on ne peut requêter que sur la table ps_ficheAbo...
		//$sql = 'SELECT COUNT(fa.*)';
		$sql = 'SELECT *';
		
		$sql .= ' FROM '. _DB_PREFIX_ .'ficheAbo as fa';
	
		$sql .= ' WHERE';
		
		$sql .= ' EXISTS (SELECT * FROM ps_fiche as f WHERE f.active = 1 AND f.public = 1 AND f.type = 1 AND f.id_customer = fa.id_customer)';
		
		$sql .= ' AND EXISTS (SELECT * FROM ps_fiche as f WHERE f.active = 1 AND f.public = 1 AND f.type = 0 AND f.id_customer = fa.id_customer)';
		
		if ($excludeUsersAdmin)
			$sql .= ' AND fa.id_customer NOT IN ('.$excludeUsersAdmin.')';
		
		//echo 'sql = '.$sql.'---';
		
		/*
		// LVM : on ne peut pas mettre un champ en particulier !!  On ne peut mettre qu'* !!
		//       et donc pas de distinct !!  On est obligé de filtrer dans le tableau résultat après la requête en base !!
		//$sql .= 'SELECT DISTINCT(id_customer) as id_customer';
		$sql .= 'SELECT *';
		
		$sql .= ' FROM '._DB_PREFIX_.'fiche';
		
		$sql .= ' WHERE';
		
		$sql .= ' active = 1';
		
		$sql .= ' AND public = 1'; // = privé
		
		if ($excludeUsersAdmin)
			$sql .= ' AND id_customer NOT IN ('.$excludeUsersAdmin.')';
		
		if ($orderBy != null)
		{
			$sens = ( $asc == true ) ? 'ASC':'DESC';
			
			$sql .= ' ORDER BY '.$orderBy.' '.$sens;
		}
		
		if ($start != -1 || $end != -1)
		{
			$sql .= ' LIMIT '.$start.', '.$end;
		}
		*/
		
		if ($rows = Db :: getInstance()->ExecuteS($sql)) {
			return ObjectModel :: hydrateCollection(__CLASS__, $rows);
		}
	
		return array();
	}
	
	// LVM
	public static function getGroupnameLFVCustomer($id_customer, $id_lang=5)
	{
		$sql = 'SELECT gl.name FROM ' . _DB_PREFIX_ . 'group_lang as gl, '. _DB_PREFIX_ . 'customer_group as cg';
		
		$sql .= ' WHERE cg.id_customer = '.(int)($id_customer);
		
		$sql .= ' AND gl.id_group = cg.id_group';		
		$sql .= ' AND gl.id_lang = '.(int)$id_lang;
		$sql .= " AND gl.name LIKE 'LFV%'";
		
		$groupname = '';
		
		if ($rows = Db :: getInstance()->ExecuteS($sql)) 
		{
			$groupname = (string)($rows[0]['name']);
		}
		
		//echo 'groupname = '.$groupname.'---';
			
		return $groupname;
	}
	
}
